package 面试经典150题.链表;

import common.ListNode;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author tmh
 * @date 2024/6/16 14:28
 * @description
 */
public class T82删除排序链表中的重复元素II {

    public ListNode deleteDuplicates(ListNode head) {
        //如果head为null，那么就直接返回null
        if(head==null){
            return null;
        }
        ListNode pNode=head;
        Map<Integer,Integer> map = new HashMap<>();
        //遍历链表，获取链表里面每个值出现的次数放入map里面
        while (pNode!=null){
            Integer count = map.getOrDefault(pNode.val, 0);
            map.put(pNode.val,count+1);
            pNode=pNode.next;
        }
        //遍历map，获取到出现次数大于1的值
        List<Integer> result = map.entrySet().stream().filter(entry -> entry.getValue() > 1)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());

        //对链表的头进行校验，保证头元素是不会重复的，①因为可能出现[1,1]这样的情况，遍历完了之后head为null
        while (head!=null&&result.contains(head.val)){
                head=head.next;
        }
        //②所以这里对head再做了一次校验，如果是null，那么就直接返回null
        if(head==null){
            return null;
        }
        //然后再把head的值赋值给pNode，让pNode对链表进行操作，如果pNode的next不为空，那么就执行删除的逻辑，不然的话pNode就往后面移动
        pNode= head;
        while (pNode.next!=null){
            if(result.contains(pNode.next.val)){
                pNode.next=pNode.next.next;
            }else {
                pNode=pNode.next;
            }
        }
        //最后返回head即可
        return head;
    }
}
